package com.ckn.service;

import com.ckn.enums.PayEnumStrategy;
import com.ckn.factory.PayFactory;
import com.ckn.strategy.AlibabaPay;
import com.ckn.strategy.PayHandler;
import com.ckn.strategy.WeiXinPay;
import com.xx.utils.ValidationUtil;
import jakarta.annotation.Resource;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;


/**
 * @Author chenkangning
 * @Date 2024/6/14 9:43
 */
@Service
@SuppressWarnings("all") // 忽略警告
public class PayService {

    @Resource
    ApplicationContext applicationContext;

    /**
     * 使用ifelse的方式实现支付
     * @param code
     * @return
     */
    public String doPayV1(String code){
        if (ValidationUtil.isEmpty(code)){
            return "code不能为空!!";
        }

        if (code.equals("alibaba")){
            System.out.println("调用阿里巴巴支付宝支付");
            return "支付宝支付";
        }else if (code.equals("weixin")){
            System.out.println("调用微信支付");
            return "微信支付";
        }else{
            System.out.println("找不到！该支付方式");
            return "找不到该支付方式";
        }
    }

    /**
     * 使用策略模式
     * @return
     */
    public String doPayV2(String code){
        if (ValidationUtil.isEmpty(code)){
            return "code不能为空!!";
        }
        PayHandler payHandler = null;

        if (code.equals("alibaba")){
            return new AlibabaPay().doPay("alibaba");
        }else if (code.equals("weixin")){
            return new WeiXinPay().doPay("weixin");
        }else{
            return "找不到该支付方式";
        }
    }

    /**
     * 使用策略模式+枚举
     * @param code
     * @return
     */
    public String doPayV3(String code){
        if (ValidationUtil.isEmpty(code)){
            return "code不能为空!!";
        }
        PayEnumStrategy enums = PayEnumStrategy.getPaymentEnums(code);
        if (ValidationUtil.isEmpty(enums)){
            return "找不到该支付方式!!";
        }
        PayHandler bean = applicationContext.getBean(enums.getBeanName(),PayHandler.class);
        return bean.doPay(code);
    }


    /**
     * 使用策略模式+工厂模式
     * @param code
     * @return
     */
    public String doPayV4(String code){
        PayHandler invokeStrategy = PayFactory.getInvokeStrategy(code);
        if (ValidationUtil.isEmpty(invokeStrategy)){
            return "找不到该支付方式!!";
        }
        return invokeStrategy.doPay(code);
    }
}
